/**
 * 全局Token检查服务
 * 在应用启动时自动开始检查，无需组件
 */
import { checkTokenAPI, type TokenInfo } from '@/services/login'
import { userInfo, refreshToken } from '@/stores/user'
import type { Data } from '@/types/common/response'

class TokenChecker {
	private refreshLock = false
	private refreshTimer: number | null = null

	/**
	 * 开始token检查定时器
	 */
	start() {
		console.log('TokenChecker: 开始token检查服务')
		// 每30分钟检查一次token状态（测试用）
		this.refreshTimer = setInterval(() => {
			this.checkTokenStatus()
		}, 1800000)
	}

	/**
	 * 停止token检查定时器
	 */
	stop() {
		console.log('TokenChecker: 停止token检查服务')
		if (this.refreshTimer) {
			clearInterval(this.refreshTimer)
			this.refreshTimer = null
		}
	}

	/**
	 * 检查token状态，若有效期小于半小时自动续期
	 */
	private async checkTokenStatus() {
		console.log('TokenChecker: 开始检查token状态...')
		
		// 如果用户未登录，停止检查
		if (!userInfo.value?.access_token) {
			console.log('TokenChecker: 用户未登录，停止token检查')
			this.stop()
			return
		}
		
		console.log('TokenChecker: 当前access_token:', userInfo.value.access_token)
		
		try {
			console.log('TokenChecker: 调用checkTokenAPI...')
			const response = await checkTokenAPI(userInfo.value.access_token)
			console.log('TokenChecker: checkTokenAPI响应:', response)
			
			// 检查响应格式 - 根据后端实际返回的数据结构处理
			let tokenInfo: TokenInfo | null = null
			
			// 检查是否是标准的{code, data, msg}格式
			if (response && typeof response === 'object' && 'code' in response) {
				const dataResponse = response as Data<TokenInfo>
				if (dataResponse.code === 0 && dataResponse.data) {
					tokenInfo = dataResponse.data
				}
			} else {
				// 直接返回token信息格式（根据你提供的实际响应）
				tokenInfo = response as TokenInfo
			}
			
			if (!tokenInfo || !tokenInfo.exp) {
				console.warn('TokenChecker: Token检查失败，停止定时器，响应:', response)
				this.stop()
				return
			}
			
			// 从exp字段计算过期时间（exp是Unix时间戳，单位是秒）
			const expireTime = tokenInfo.exp * 1000 // 转换为毫秒
			const currentTime = new Date().getTime()
			const expiredPeriod = expireTime - currentTime
			
			console.log('TokenChecker: Token过期时间戳:', tokenInfo.exp, '转换后:', new Date(expireTime))
			console.log(`TokenChecker: Token还有 ${Math.floor(expiredPeriod / 60000)} 分钟过期`)
			
			// 临时测试：小于60分钟自动续约（原来是30分钟）
			if (expiredPeriod <= 60 * 60 * 1000) {
				console.log('TokenChecker: Token即将过期，开始自动刷新...')
				
				// 防止重复刷新
				if (!this.refreshLock) {
					this.refreshLock = true
					
					try {
						console.log('TokenChecker: 调用refreshToken...')
						await refreshToken()
						console.log('TokenChecker: Token自动刷新成功')
					} catch (error) {
						console.error('TokenChecker: Token自动刷新失败:', error)
						// 刷新失败，停止定时器
						this.stop()
					} finally {
						this.refreshLock = false
					}
				} else {
					console.log('TokenChecker: Token正在刷新中，跳过本次刷新')
				}
			}
		} catch (error) {
			console.error('TokenChecker: Token检查异常:', error)
			// 发生异常，停止定时器
			this.stop()
		}
	}
}

// 创建全局实例
const tokenChecker = new TokenChecker()

export default tokenChecker
